# -*- mode: python -*-
###
#
# (c) 2000-2007 Wijnand Modderman <wijnand at tehmaze dot com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#   * Redistributions of source code must retain the above copyright notice,
#     this list of conditions, and the following disclaimer.
#   * Redistributions in binary form must reproduce the above copyright notice,
#     this list of conditions, and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#   * Neither the name of the author of this software nor the name of
#     contributors to this software may be used to endorse or promote products
#     derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###

__revision__ = '$Hg:$'

# system imports
import datetime
import re

# DDB imports
from ddb import module
from ddb.user import users
from ddb.tools import syntax, strtotime, _re_date, _re_time
from ddb.config import configFile

# Twisted imports
from twisted.internet import reactor

class Remind:

    __access__ = ['c']

    def __init__(self):
        self.config = configFile('data/remind.cron')
        self.config.save()

    def remind(self, event):
        """<time and/or date> <text>

        remind you about <text> on the given timestamp. Valid timestamp is
        <HH:MM[:SS]>, valid dates are <DD-MM-YY[YY]> or <DD/MM/YY[YY]>."""
        if not event.args:
            event.reply(syntax())
            return
        try:
            ts = strtotime(' '.join(event.args.split()[0:2]))
        except ValueError, e:
            event.reply(str(e))
            return
        if ts < datetime.datetime.now():
            event.reply('can not work with a date in the past')
            return
        text = event.args
        text = _re_date.sub('', text)
        text = _re_time.sub('', text)
        text = re.sub('\s\s+', ' ', text).strip()
        if text[0] == '+':
            text = text[1:].strip()
        #event.reply('at %s: %s' % (str(ts), text))
        #if not self.config.sectionExists(event.user):
        #    self.config.sectionAdd(event.user)
        #self.config.set(event.user, ts,
        delta = int(ts.strftime('%s')) - int(datetime.datetime.now().strftime('%s'))
        reactor.callLater(delta, self._remind, event, text)
        event.reply('in %s seconds I will remind you about: %s' % (delta, text))

    def _remind(self, event, text):
        event.reply('reminder: %s' % text)
